package com.tacc.tyun.util;

import com.tacc.tyun.model.MsgMenu;
import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 把一个list集合,里面的bean含有 parentId 转为树形式
 */
public class TreeUtil {

	List<MsgMenu> returnList = new ArrayList<MsgMenu>();

	List<MsgMenu> newReturnList = new ArrayList<MsgMenu>();

	/**
	 * 根据父节点的ID获取所有子节点
	 */
	public List<MsgMenu> getChildMsgMenus(List<MsgMenu> list, String menuParentId) {
		//排序
		ListSortUtil<MsgMenu> msgMenuList=new ListSortUtil<MsgMenu>();
		msgMenuList.sortByMethod(list,"getCreateTime",false);

		List<MsgMenu> returnList = new ArrayList<MsgMenu>();
		for (Iterator<MsgMenu> iterator = list.iterator(); iterator.hasNext();) {
			MsgMenu t = (MsgMenu) iterator.next();
			// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
			if (StringUtils.equals(t.getMenuParentId(),menuParentId)) {
				recursionFn(list, t);
				returnList.add(t);
			}
		}
		return returnList;
	}

	/**
	 * 递归列表
	 */
	private void  recursionFn(List<MsgMenu> list, MsgMenu t) {
		List<MsgMenu> childList = getChildList(list, t);// 得到子节点列表

		//排序
		ListSortUtil<MsgMenu> msgMenuList=new ListSortUtil<MsgMenu>();
		msgMenuList.sortByMethod(childList,"getCreateTime",false);

		t.setChildren(childList);
		for (MsgMenu tChild : childList) {
			if (hasChild(list, tChild)) {// 判断是否有子节点
				//returnList.add(MsgMenu);
				Iterator<MsgMenu> it = childList.iterator();
				while (it.hasNext()) {
					MsgMenu n = (MsgMenu) it.next();
					recursionFn(list, n);
				}
			}
		}
	}

	/**
	 * 递归列表
	 */
	private void recursionFn(List<MsgMenu> list) {
		if (list!=null && list.size()>0){
			for (MsgMenu tChild : list) {
				newReturnList.add(tChild);
				if (hasChild(list, tChild)) {// 判断是否有子节点
					for (MsgMenu menu:tChild.getChildren()){
						newReturnList.add(menu);
					}
				}
				recursionFn(tChild.getChildren());
			}
		}
	}

	public List<MsgMenu> getMsgMenuOrder(List<MsgMenu> list){
		recursionFn(list);
		return newReturnList;
	}

	// 得到子节点列表
	private List<MsgMenu> getChildList(List<MsgMenu> list, MsgMenu t) {

		List<MsgMenu> tlist = new ArrayList<MsgMenu>();
		Iterator<MsgMenu> it = list.iterator();
		while (it.hasNext()) {
			MsgMenu n = (MsgMenu) it.next();
			if (StringUtils.equals(n.getMenuParentId(),t.getMenuId())) {
				tlist.add(n);
			}
		}

		ListSortUtil<MsgMenu> msgMenuList=new ListSortUtil<MsgMenu>();
		msgMenuList.sortByMethod(tlist,"getCreateTime",false);
		return tlist;
	}

	/**
	 * 根据父节点的ID获取所有子节点
	 * @param list 分类表
	 * @param typeId 传入的父节点ID
	 * @param prefix 子节点前缀
	 */
	public List<MsgMenu> getChildMsgMenus(List<MsgMenu> list, int typeId,String prefix){
		if(list == null) {
			return null;
		}

		for (Iterator<MsgMenu> iterator = list.iterator(); iterator.hasNext();) {
			MsgMenu node = (MsgMenu) iterator.next();
			// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
			if (node.getMenuParentId().equals(typeId)) {
				recursionFn(list, node,prefix);
			}
			// 二、遍历所有的父节点下的所有子节点
            /*if (node.getParentId()==0) {
                recursionFn(list, node);
            }*/
		}
		return returnList;
	}

	private void recursionFn(List<MsgMenu> list, MsgMenu node,String p) {
		List<MsgMenu> childList = getChildList(list, node);// 得到子节点列表
		if (hasChild(list, node)) {// 判断是否有子节点
			returnList.add(node);
			Iterator<MsgMenu> it = childList.iterator();
			while (it.hasNext()) {
				MsgMenu n = (MsgMenu) it.next();
				n.setName(p+n.getName());
				recursionFn(list, n,p+p);
			}
		} else {
			returnList.add(node);
		}
	}

	// 判断是否有子节点
	private boolean hasChild(List<MsgMenu> list, MsgMenu t) {
		return getChildList(list, t).size() > 0 ? true : false;
	}

	// 本地模拟数据测试
	public void main(String[] args) {
		/*long start = System.currentTimeMillis();
		List<MsgMenu> MsgMenuList = new ArrayList<MsgMenu>();

		MsgMenuUtil mt = new MsgMenuUtil();
		List<MsgMenu> ns=mt.getChildMsgMenus(MsgMenuList,0);
		for (MsgMenu m : ns) {
			System.out.println(m.getName());
			System.out.println(m.getChildren());
		}
		long end = System.currentTimeMillis();
		System.out.println("用时:" + (end - start) + "ms");*/
	}

}
